#ifndef FILEREADER_H
#define FILEREADER_H

//Библиотека ffmpeg.
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
};


//Библиотека Qt.
#include <QStringList>


//Внутренняя библиотека.
#include "viddevice.h"


//Объявление внешних классов.
class VidFrame;
class QTimer;


class FileReader : public VidDevice
{
	Q_OBJECT
signals:
	void nextFile(int index);

public:
	//Конструктор.
	FileReader(QString path, int index, QObject *parent = NULL);

	//Деструктор.
	virtual ~FileReader();

	//Функция возврата типа устройства.
	virtual VidDevice::DEVTYPE getType() {return VidDevice::FILEREADER;}

	//Функция возврата списка значений параметра устройства.
	virtual bool getListParam(DevParam::GET_LIST_PARAM param, QHash<int, QVariant> *valhash);

	//Функция возврата параметра устройства.
	virtual bool getParam(DevParam::GET_PARAM param, QVariant *value);

public slots:
	//Слот установки параметра устройства.
	virtual void slotSetParam(DevParam::SET_PARAM param, int value);

protected:
	//Функция открытия устройства.
	virtual bool openDevice();

	//Функция закрытия устройства.
	virtual void closeDevice();

	//Функция запуска видеозахвата.
	virtual bool startCapturing();

	//Функция остановки видеозахвата.
	virtual bool stopCapturing();

private:
	enum STATE {UNACTIVE, ACTIVE, CAPTURING};

	//Состояние устройства.
	STATE devState;

	//Список файлов.
	QStringList filesList;

	//Индекс текущего файла в списке.
	int curFileIndex;

	//Кольцевая прокрутка файлового списка.
	bool isRing;

	//FFMPEG.
	AVFormatContext *fmtCtx;
	AVCodecContext  *codecCtx;
	AVCodec         *vidCodec;
	AVFrame         *srcVidFrame;
	AVFrame         *dstVidFrame;
	SwsContext      *swsCtx;

	int vidStreamIndex;

	//Видеоформат.
	PixelFormat ffmpegPixFmt;
	int width, height;

	VidFrame *vidFrame;

	//Видеотаймер.
	QTimer *vidTimer;

private slots:
	//Слот сработки видеотаймера.
	void slotVidTimerTimeout();

};

#endif
